{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 进阶作业——Ames 房价预测"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 逻辑回归(LogisticRegression)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "#首先导入必要的模块\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取数据\n",
    "train_data = pd.read_json(\"RentListingInquries_train.json\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def convertStrToint(str_arr):\n",
    "    \n",
    "    int_arr=[]\n",
    "\n",
    "    for i in range(len(str_arr)):\n",
    "\n",
    "        if(str_arr[i] == 'low'):\n",
    "\n",
    "            int_arr.append(0)\n",
    "\n",
    "        elif(str_arr[i] == 'medium'):\n",
    "\n",
    "            int_arr.append(1)\n",
    "\n",
    "        elif(str_arr[i] == 'high'):\n",
    "\n",
    "            int_arr.append(2) \n",
    "            \n",
    "    return int_arr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "def removeUselessData(data):\n",
    "    \n",
    "    remove_data = data.drop([\"building_id\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"created\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"description\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"display_address\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"features\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"listing_id\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"manager_id\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"photos\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"street_address\"], axis = 1)\n",
    "    remove_data = remove_data.drop([\"interest_level\"], axis = 1)\n",
    "    \n",
    "    return remove_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "pd_str = train_data['interest_level']\n",
    "\n",
    "interest_level_str_arr = pd_str.values\n",
    "\n",
    "#将y值（interest_level）的字符串转换为int\n",
    "interest_level_int = convertStrToint(interest_level_str_arr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "#数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "#初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "#删除无用的数据\n",
    "remove_data = removeUselessData(data)\n",
    "\n",
    "#分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(remove_data)\n",
    "\n",
    "y_train = interest_level_int\n",
    "\n",
    "#限制训练集个数为1000\n",
    "n_trains = 1000\n",
    "y_train = y_train[:n_trains]\n",
    "X_train = X_train[:n_trains]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### default Logistic Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr = LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is: [0.78488878 0.78897388 0.77610524 0.78364009 0.7755406 ]\n",
      "cv logloss is: 0.7818297207089233\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.cross_validation import cross_val_score\n",
    "loss = cross_val_score(lr, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "print('logloss of each fold is:', -loss)\n",
    "print('cv logloss is:',-loss.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "grid = GridSearchCV(lr_penalty, tuned_parameters, cv= 5, scoring='neg_log_loss')\n",
    "grid.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.0008007 , 0.00100102, 0.00100117, 0.00100045, 0.0010006 ,\n",
       "        0.00120096, 0.        , 0.00312519, 0.00625076, 0.0031251 ,\n",
       "        0.00625048, 0.00312519, 0.00312538, 0.00312533]),\n",
       " 'std_fit_time': array([4.00352506e-04, 3.56832255e-07, 1.78416128e-07, 5.09122765e-07,\n",
       "        6.10649513e-07, 7.49207711e-04, 0.00000000e+00, 6.25038147e-03,\n",
       "        7.65558985e-03, 6.25019073e-03, 7.65523945e-03, 6.25038147e-03,\n",
       "        6.25076294e-03, 6.25066757e-03]),\n",
       " 'mean_score_time': array([0.00040045, 0.0008007 , 0.00040035, 0.00100107, 0.00100117,\n",
       "        0.00040784, 0.        , 0.        , 0.        , 0.        ,\n",
       "        0.        , 0.        , 0.00312519, 0.        ]),\n",
       " 'std_score_time': array([4.90446445e-04, 4.00352563e-04, 4.90329667e-04, 2.33601546e-07,\n",
       "        4.62310777e-07, 4.99628227e-04, 0.00000000e+00, 0.00000000e+00,\n",
       "        0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n",
       "        6.25038147e-03, 0.00000000e+00]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10, 10, 100,\n",
       "                    100, 1000, 1000],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'split0_test_score': array([-1.09861229, -1.03756551, -0.89533764, -0.87764539, -0.81331999,\n",
       "        -0.80822125, -0.76321787, -0.78488878, -0.77119274, -0.75871898,\n",
       "        -0.77836555, -0.76821169, -0.77923245, -0.77753269]),\n",
       " 'split1_test_score': array([-1.09861229, -1.03818467, -0.89505425, -0.8799782 , -0.81462148,\n",
       "        -0.81128749, -0.76722901, -0.78897388, -0.75515976, -0.75936149,\n",
       "        -0.75682964, -0.75380084, -0.75711893, -0.7565341 ]),\n",
       " 'split2_test_score': array([-1.09861229, -1.03744109, -0.89505425, -0.87586802, -0.81177259,\n",
       "        -0.8024182 , -0.74161023, -0.77610524, -0.71442447, -0.73622355,\n",
       "        -0.7106514 , -0.71499066, -0.71029668, -0.71079501]),\n",
       " 'split3_test_score': array([-1.09861229, -1.03654738, -0.89158157, -0.87335951, -0.80482118,\n",
       "        -0.80319667, -0.74741706, -0.78364009, -0.7282704 , -0.74856207,\n",
       "        -0.72515829, -0.72883107, -0.72486907, -0.72526241]),\n",
       " 'split4_test_score': array([-1.09861229, -1.03689031, -0.89158157, -0.87437624, -0.80632749,\n",
       "        -0.8013741 , -0.74454978, -0.7755406 , -0.71746628, -0.73733314,\n",
       "        -0.7148677 , -0.71826781, -0.71465175, -0.71501557]),\n",
       " 'mean_test_score': array([-1.09861229, -1.03732749, -0.89372937, -0.87625303, -0.81018804,\n",
       "        -0.80531141, -0.75283926, -0.78184032, -0.73739938, -0.74807139,\n",
       "        -0.73729122, -0.73690974, -0.73735272, -0.73714275]),\n",
       " 'std_test_score': array([0.        , 0.00056579, 0.00174946, 0.00235875, 0.00388746,\n",
       "        0.00380817, 0.0103882 , 0.00521298, 0.02224838, 0.00997312,\n",
       "        0.02623804, 0.02081388, 0.02669083, 0.02586693]),\n",
       " 'rank_test_score': array([14, 13, 12, 11, 10,  9,  7,  8,  5,  6,  3,  1,  4,  2]),\n",
       " 'split0_train_score': array([-1.09861229, -1.03702601, -0.89314788, -0.87495558, -0.80799461,\n",
       "        -0.80280058, -0.74244819, -0.77810751, -0.71863898, -0.73806542,\n",
       "        -0.71758994, -0.719425  , -0.71755693, -0.71762763]),\n",
       " 'split1_train_score': array([-1.09861229, -1.03660584, -0.89303944, -0.87407565, -0.80720731,\n",
       "        -0.80205663, -0.74326006, -0.77700729, -0.72400412, -0.73993176,\n",
       "        -0.72308162, -0.72453788, -0.72304902, -0.72311293]),\n",
       " 'split2_train_score': array([-1.09861229, -1.03705301, -0.89303944, -0.87592342, -0.80994214,\n",
       "        -0.80482326, -0.75246185, -0.78096738, -0.73525354, -0.74740869,\n",
       "        -0.73450025, -0.73536275, -0.73447519, -0.73450841]),\n",
       " 'split3_train_score': array([-1.09861229, -1.03735508, -0.89469184, -0.87630737, -0.81064151,\n",
       "        -0.803954  , -0.74923623, -0.7787996 , -0.73259759, -0.74498065,\n",
       "        -0.73180991, -0.73274192, -0.73178226, -0.73181625]),\n",
       " 'split4_train_score': array([-1.09861229, -1.03720921, -0.89469184, -0.87617851, -0.80999964,\n",
       "        -0.80503632, -0.75153919, -0.78098129, -0.73380934, -0.74664884,\n",
       "        -0.73303596, -0.73396752, -0.73301357, -0.73304432]),\n",
       " 'mean_train_score': array([-1.09861229, -1.03704983, -0.89372208, -0.87548811, -0.80915704,\n",
       "        -0.80373416, -0.7477891 , -0.77917261, -0.72886071, -0.74340707,\n",
       "        -0.72800354, -0.72920702, -0.72797539, -0.72802191]),\n",
       " 'std_train_score': array([1.40433339e-16, 2.51508089e-04, 7.92788124e-04, 8.50407494e-04,\n",
       "        1.31777672e-03, 1.15028408e-03, 4.17203902e-03, 1.57827238e-03,\n",
       "        6.44036761e-03, 3.73119893e-03, 6.55269871e-03, 6.17316107e-03,\n",
       "        6.55646417e-03, 6.53965596e-03])}"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7369097399389302\n",
      "{'C': 100, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "#输出最好的模型\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Users\\YuGo\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'neg-logloss' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 用LogisticRegressionCV实现正则化的 Logistic Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### L1正则"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegressionCV(Cs=[1, 10, 100, 1000], class_weight=None, cv=5,\n",
       "           dual=False, fit_intercept=True, intercept_scaling=1.0,\n",
       "           max_iter=100, multi_class='ovr', n_jobs=1, penalty='l1',\n",
       "           random_state=None, refit=True, scoring='neg_log_loss',\n",
       "           solver='liblinear', tol=0.0001, verbose=0)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegressionCV\n",
    "\n",
    "Cs = [1,10,100, 1000]\n",
    "\n",
    "lrcv_L1 = LogisticRegressionCV(Cs=Cs, cv = 5, scoring='neg_log_loss', penalty='l1', solver='liblinear', multi_class='ovr')\n",
    "\n",
    "lrcv_L1.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: array([[-0.5814977 , -0.59572411, -0.60053018, -0.60106111],\n",
       "        [-0.57824316, -0.56933371, -0.56918576, -0.56918501],\n",
       "        [-0.55020045, -0.5319516 , -0.53031768, -0.53017355],\n",
       "        [-0.55739438, -0.5391138 , -0.53715763, -0.53697248],\n",
       "        [-0.56035905, -0.54789009, -0.54738276, -0.5473512 ]]),\n",
       " 1: array([[-0.53805641, -0.5409213 , -0.54383822, -0.54417023],\n",
       "        [-0.53427164, -0.52094761, -0.51977932, -0.51966731],\n",
       "        [-0.52080186, -0.5078763 , -0.50715698, -0.50710241],\n",
       "        [-0.52333574, -0.51021814, -0.50896438, -0.50885205],\n",
       "        [-0.53627644, -0.52983209, -0.53008951, -0.53013707]]),\n",
       " 2: array([[-0.26091709, -0.26154699, -0.26597967, -0.26657196],\n",
       "        [-0.26488972, -0.26570009, -0.26860143, -0.26904699],\n",
       "        [-0.26132881, -0.24906353, -0.24618084, -0.24589825],\n",
       "        [-0.26089981, -0.25763984, -0.25602895, -0.25588312],\n",
       "        [-0.24715208, -0.22838155, -0.22591762, -0.22570317]])}"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lrcv_L1.scores_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C is: [10 10 10]\n"
     ]
    }
   ],
   "source": [
    "# scores_：dict with classes as the keys, and the values as the grid of scores obtained during cross-validating each fold,\n",
    "# Each dict value has shape (n_folds, len(Cs))\n",
    "n_Cs = len(Cs)\n",
    "n_classes = 3\n",
    "scores =  np.zeros((n_classes,n_Cs))\n",
    "\n",
    "for j in range(n_classes):\n",
    "        scores[j][:] = np.mean(lrcv_L1.scores_[j],axis = 0)\n",
    "    \n",
    "mse_mean = -np.mean(scores, axis = 0)\n",
    "pyplot.plot(np.log10(Cs), mse_mean.reshape(n_Cs,1)) \n",
    "#plt.plot(np.log10(reg.Cs)*np.ones(3), [0.28, 0.29, 0.30])\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('logloss')\n",
    "pyplot.show()\n",
    "\n",
    "print ('C is:',lrcv_L1.C_)  #对多类分类问题，每个类别的分类器有一个C"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ -0.37944566,  -0.78692955,   2.01390359,   9.69804436,\n",
       "         23.77675243],\n",
       "       [  0.29552804,   0.59121601,  -1.61193719,  -9.25583951,\n",
       "        -17.79044482],\n",
       "       [  0.21883257,   0.65436779,  -0.60036435,  -3.07997534,\n",
       "        -20.76226806]])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lrcv_L1.coef_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### L2正则"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegressionCV(Cs=[1, 10, 100, 1000], class_weight=None, cv=5,\n",
       "           dual=False, fit_intercept=True, intercept_scaling=1.0,\n",
       "           max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2',\n",
       "           random_state=None, refit=True, scoring='neg_log_loss',\n",
       "           solver='liblinear', tol=0.0001, verbose=0)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegressionCV\n",
    "\n",
    "Cs = [1, 10,100,1000]\n",
    "\n",
    "# 大量样本（6W+）、高维度（93），L2正则 --> 缺省用lbfgs，为了和GridSeachCV比较，也用liblinear\n",
    "\n",
    "lr_cv_L2 = LogisticRegressionCV(Cs=Cs, cv = 5, scoring='neg_log_loss', penalty='l2', solver='liblinear', multi_class='ovr')\n",
    "lr_cv_L2.fit(X_train, y_train)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: array([[-0.59770098, -0.57728014, -0.59176075, -0.59988865],\n",
       "        [-0.60210792, -0.57377962, -0.56859641, -0.56907647],\n",
       "        [-0.58865554, -0.54954413, -0.53289582, -0.53044645],\n",
       "        [-0.59845396, -0.55970085, -0.54062314, -0.53734752],\n",
       "        [-0.59441442, -0.5595078 , -0.54830575, -0.54741251]]),\n",
       " 1: array([[-0.54520364, -0.53277127, -0.5393188 , -0.54347696],\n",
       "        [-0.54805451, -0.52838312, -0.52072462, -0.51975786],\n",
       "        [-0.53791385, -0.51616879, -0.50798884, -0.50716757],\n",
       "        [-0.54373118, -0.52321762, -0.51121047, -0.50908438],\n",
       "        [-0.54818782, -0.53267593, -0.52960012, -0.53004605]]),\n",
       " 2: array([[-0.27025261, -0.25995462, -0.26063333, -0.26553612],\n",
       "        [-0.27078294, -0.26347849, -0.26487961, -0.2683785 ],\n",
       "        [-0.27079012, -0.25939359, -0.24921175, -0.24627914],\n",
       "        [-0.26891749, -0.26152634, -0.25685585, -0.25597227],\n",
       "        [-0.25765794, -0.24217283, -0.22921759, -0.22608724]])}"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr_cv_L2.scores_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C is: [100 100 100]\n"
     ]
    }
   ],
   "source": [
    "# dict with classes as the keys, and the values as the grid of scores obtained during cross-validating each fold,\n",
    "# Each dict value has shape (n_folds, len(Cs))\n",
    "n_Cs = len(Cs)\n",
    "n_classes = 3\n",
    "scores =  np.zeros((n_classes,n_Cs))\n",
    "\n",
    "for j in range(n_classes):\n",
    "        scores[j][:] = np.mean(lr_cv_L2.scores_[j],axis = 0)\n",
    "    \n",
    "mse_mean = -np.mean(scores, axis = 0)\n",
    "pyplot.plot(np.log10(Cs), mse_mean.reshape(n_Cs,1)) \n",
    "#plt.plot(np.log10(reg.Cs)*np.ones(3), [0.28, 0.29, 0.30])\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('neg-logloss')\n",
    "pyplot.show()\n",
    "\n",
    "print ('C is:',lr_cv_L2.C_)  #对多类分类问题，每个类别的分类器有一个C"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
